package crypt;

import util.Util;

public class RSA {

	int n, p, q, euler, d, e;
	
	public RSA()
	{
		p = (int)nextPrime();
		do
		{	
			q = (int)nextPrime();
		} while(p == q);
		
		System.out.println(p + " ; " + q);
		n = p * q;
		euler = (p - 1) * (q - 1);
		e = genEx();
		d = Util.modInvI(e, euler);
	}
	
	private int genEx()
	{
		do
		{
			e = Util.getRnd().nextInt() % 100;
			if(e < 0)
				e = -e;
		}
		while(Util.nzd(e, euler) != 1);
		return e;
	}
	
	public static long nextPrime()
	{
		int p;
		do
		{
			p = Util.getRnd().nextInt() % 1000;
		}
		while(!Util.jeProst(p));
		
		if(p < 0)
			return -p;
		else
			return p;
	}
	
	public long encrypt(long msg)
	{
		return Util.modPowL(msg, e, n);
	}
	
	public long decrypt(long msg)
	{
		return Util.modPowL(msg, d, n);
	}
	
	public static void main(String[] args) {
		RSA rsa = new RSA();
		long msg = rsa.encrypt(47);
		System.out.println("Enc : " + msg);
		System.out.println("Dec : " + rsa.decrypt(msg));
	}

}
